package com.linran.webjsonrsp.bean;

import lombok.Getter;
import lombok.ToString;

/**
 * 定义返回类
 *
 * @author lin
 * @date 2020-05-05 15:28
 */
@Getter
@ToString
public class Result<T> {
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 定义返回内容
     */
    private String message;
    /**
     * 定义返回内容
     */
    private T data;

    public Result(ResultStatus resultStatus, T data) {
        this.code = resultStatus.getCode();
        this.message = resultStatus.getMessage();
        this.data = data;
    }

    /**
     * 自定义返回内容
     */
    public Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 业务成功返回业务代码和描述信息
     */
    public static Result<Void> success() {
        return new Result<>(ResultStatus.SUCCESS, null);
    }

    /**
     * 业务成功返回业务代码，描述和返回参数
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(ResultStatus.SUCCESS, data);
    }

    /**
     * 业务成功返回业务代码，描述和返回参数
     */
    public static <T> Result<T> success(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return success(data);
        }
        return new Result<>(resultStatus, data);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> Result<T> failure() {
        return new Result<>(ResultStatus.INTERNAL_SERVER_ERROR, null);
    }

    /**
     * 业务异常返回业务代码，描述和返回参数
     */
    public static <T> Result<T> failure(T data) {
        return new Result<>(ResultStatus.INTERNAL_SERVER_ERROR, data);
    }

    /**
     * 业务异常返回业务代码，描述和返回参数
     */
    public static <T> Result<T> failure(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return failure(data);
        }
        return new Result<>(resultStatus, data);
    }

    /**
     * 业务异常返回业务代码，描述和返回参数
     */
    public static <T> Result<T> failure(String message, T data) {
        if (message == null) {
            return failure(data);
        }
        return new Result<>(ResultStatus.INTERNAL_SERVER_ERROR.getCode(), message, data);
    }
}
